package org.example.actualcombat.demos.web.modules.pms.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.example.actualcombat.demos.web.common.api.CommonResult;
import org.example.actualcombat.demos.web.modules.pms.mapper.PmsProductAttributeCategoryMapper;
import org.example.actualcombat.demos.web.modules.pms.mapper.PmsProductCategoryAttributeRelationMapper;
import org.example.actualcombat.demos.web.modules.pms.mapper.PmsProductCategoryMapper;
import org.example.actualcombat.demos.web.modules.pms.model.PmsProductCategoryAttributeRelation;
import org.example.actualcombat.demos.web.modules.pms.model.PmsProductCategoryModel;
import org.example.actualcombat.demos.web.modules.pms.model.dto.PmsProductCategoryDto;
import org.example.actualcombat.demos.web.modules.pms.model.dto.ProductCateChildrenDto;
import org.example.actualcombat.demos.web.modules.pms.service.PmsProductCategoryAttributeRelationService;
import org.example.actualcombat.demos.web.modules.pms.service.PmsProductCategoryService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

@Service
public class PmsProductCategoryServiceImpl extends ServiceImpl<PmsProductCategoryMapper, PmsProductCategoryModel> implements PmsProductCategoryService {
    @Autowired
    private PmsProductCategoryMapper pmsProductCategoryMapper;
    @Autowired
    private PmsProductCategoryAttributeRelationService relationService;


    @Override
    public Page list(Long parentId,Integer pageNum, Integer pageSize) {
        Page<PmsProductCategoryModel> page = new Page<>(pageNum, pageSize);
//        Page<PmsProductAttributeModel> page = new Page<>(pageNum, pageSize);
        QueryWrapper<PmsProductCategoryModel> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(PmsProductCategoryModel::getParentId,parentId);
        Page<PmsProductCategoryModel> resultPage = pmsProductCategoryMapper.selectPage(page, queryWrapper);
//        Page<PmsProductAttributeModel> resultPage = this.page(page, queryWrapper);
//        resultPage.setTotal(this.count()); // 设置总数信息
        return resultPage;
    }

    @Override
    @Transactional
    public boolean cusTomSave(PmsProductCategoryDto pmsProductCategoryDto) {
        // 保存商品分类
        // 得到商品分类保存后的主键id，保存商品分类和筛选属性关系表
        PmsProductCategoryModel productCategory = new PmsProductCategoryModel();
        // 这里拷贝的原因：因为通过save保存，是直接通过pojo实体类里标注的数据库去直接修改值了，所以要操作不同对象。 并且 属性值不一样，也要有修改。dto会多一个list
        BeanUtils.copyProperties(pmsProductCategoryDto,productCategory);

        // 有父级， 就是2级。 没父级，就是顶级1级
        if(productCategory.getParentId() ==0){
            productCategory.setLevel(0);
        }else{
            productCategory.setLevel(1); // 因为只有两级,所以这里就写死了. 不然得话应该是每层多会有判断,并且是level+1
        }

        // 商品分类的数量属性，默认为0.
        if(productCategory.getProductCount() ==null){
            productCategory.setProductCount(0);
        }
        boolean save = this.save(productCategory);


        // 上面提取一个方法, 下面一个方法
        // 拿到商品的筛选属性
        List<Long> productAttributeIdList = pmsProductCategoryDto.getProductAttributeIdList();
        List<PmsProductCategoryAttributeRelation> list =  new ArrayList<>(); // 这里是分类-属性关系列表
        for (Long attrId : productAttributeIdList) {
            // 这里循环,是因为筛选属性传递过来的是数组. 每条数据都要做对应的存储( category和attr做对应)
            PmsProductCategoryAttributeRelation pmsProductCategoryAttributeRelation = new PmsProductCategoryAttributeRelation();
            pmsProductCategoryAttributeRelation.setProductCategoryId(productCategory.getId()); // category对象里的主键id, 就是需要设置在关系表里的id
            pmsProductCategoryAttributeRelation.setProductAttributeId(attrId);
            list.add(pmsProductCategoryAttributeRelation);
        }
        // 页面里的多个对象, 所以使用列表存储
        boolean saveBatch = relationService.saveBatch(list);// 这里是使用的service,并不是Mapper. 也可以分别注入

        return save && saveBatch;
    }
    @Override
    public  boolean update(PmsProductCategoryDto pmsProductCategoryDto){
        // 保存商品分类
        // 得到商品分类保存后的主键id，保存商品分类和筛选属性关系表
        PmsProductCategoryModel productCategory = new PmsProductCategoryModel();
        // 这里拷贝的原因：因为通过save保存，是直接通过pojo实体类里标注的数据库去直接修改值了，所以要操作不同对象。 并且 属性值不一样，也要有修改。dto会多一个list
        BeanUtils.copyProperties(pmsProductCategoryDto,productCategory);

        // 有父级， 就是2级。 没父级，就是顶级1级
        if(productCategory.getParentId() ==0){
            productCategory.setLevel(0);
        }else{
            productCategory.setLevel(1); // 因为只有两级,所以这里就写死了. 不然得话应该是每层多会有判断,并且是level+1
        }

        // 商品分类的数量属性，默认为0.
        if(productCategory.getProductCount() ==null){
            productCategory.setProductCount(0);
        }
        boolean save = this.save(productCategory);


        // 上面提取一个方法, 下面一个方法
        // 拿到商品的筛选属性
        List<Long> productAttributeIdList = pmsProductCategoryDto.getProductAttributeIdList();
        List<PmsProductCategoryAttributeRelation> list =  new ArrayList<>(); // 这里是分类-属性关系列表
        for (Long attrId : productAttributeIdList) {
            // 这里循环,是因为筛选属性传递过来的是数组. 每条数据都要做对应的存储( category和attr做对应)
            PmsProductCategoryAttributeRelation pmsProductCategoryAttributeRelation = new PmsProductCategoryAttributeRelation();
            pmsProductCategoryAttributeRelation.setProductCategoryId(productCategory.getId()); // category对象里的主键id, 就是需要设置在关系表里的id
            pmsProductCategoryAttributeRelation.setProductAttributeId(attrId);
            list.add(pmsProductCategoryAttributeRelation);
        }
        // 页面里的多个对象, 所以使用列表存储
        boolean saveBatch = relationService.saveBatch(list);// 这里是使用的service,并不是Mapper. 也可以分别注入

        return save && saveBatch;
    }

    @Override
    public List<ProductCateChildrenDto> getWithChildren() {
//        ProductCateChildrenDto
       List<ProductCateChildrenDto> list =  pmsProductCategoryMapper.getWithChildren();
        return list;
    }
}




















